using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Web.UI;
using Dimok.Exceptions;
//using Common;
namespace Dimok.Web.UI {

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <summary>	Exception for signalling smart errors. </summary>
	///
	/// <remarks>	Dimon, 12/21/2010. </remarks>
	////////////////////////////////////////////////////////////////////////////////////////////////////

	public class SmartException : ASPException {

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Constructor. </summary>
		///
		/// <remarks>	Dimon, 12/21/2010. </remarks>
		///
		/// <param name="message">	The message. </param>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public SmartException(string message) : base(message) { }

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Constructor. </summary>
		///
		/// <remarks>	Dimon, 12/21/2010. </remarks>
		///
		/// <param name="exc">	The exc. </param>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public SmartException(Exception exc) : base("", exc) { }

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Constructor. </summary>
		///
		/// <remarks>	Dimon, 12/21/2010. </remarks>
		///
		/// <param name="message">	The message. </param>
		/// <param name="exc">			The exc. </param>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public SmartException(string message, Exception exc) : base(message, exc) { }

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Constructor. </summary>
		///
		/// <remarks>	Dimon, 12/21/2010. </remarks>
		///
		/// <param name="exc">				The exc. </param>
		/// <param name="namedVaues">	A variable-length parameters list containing named vaues. </param>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public SmartException(Exception exc, params string[] namedVaues) : base("", exc, new NameValueCollectionEx(namedVaues)) { }

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Gets a control trace exception. </summary>
		///
		/// <remarks>	Dimon, 12/21/2010. </remarks>
		///
		/// <param name="control">		The control. </param>
		/// <param name="debugMode">	true to enable debug mode, false to disable it. </param>
		/// <param name="exc">				The exc. </param>
		///
		/// <returns>	The control trace exception. </returns>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public static Exception GetControlTraceException(Control control, bool debugMode, Exception exc) {
			List<string> message = new List<string>();
			List<string> path = new List<string>();
			path.Add(control.TemplateSourceDirectory);
			if (control.NamingContainer != null) path.Add(control.NamingContainer.TemplateControl.AppRelativeVirtualPath);
			message.Add("ID:" + control.ClientID + " @ " + Environment.NewLine + string.Join(Environment.NewLine, path.ToArray()) + Environment.NewLine);
			message.Add(GetMessages(exc));
			Exception newExc = new Exception(string.Join(Environment.NewLine, message.ToArray()), exc);
			Publish(newExc);
			return debugMode ? newExc : exc;
		}
	}
}